package pos.dominio;

import java.util.*;

import pos.datos.*;

public class GestorPlanetas {

	private GestorMazoPlanetas mazoPlaneta=null;
	private Planeta[][] galaxia = new Planeta[32][32];
	private Planeta planetaActual;
	private Planeta nuevoPlaneta;
	private Integer[] coordActuales = new Integer[2];

	public GestorPlanetas() {
		
		mazoPlaneta=new GestorMazoPlanetas();
		galaxia = getGalaxia();
		planetaActual = getPlanetaActual();
	}

	public Planeta[][] getGalaxia() {
		return galaxia;
	}

	public void setGalaxia(Planeta[][] galaxia) {
		this.galaxia = galaxia;
	}

	public Planeta getPlanetaActual() {
		return planetaActual;
	}

	public void setPlanetaActual(Planeta planetaActual) {
		this.planetaActual = planetaActual;
	}

	public void inicializarPlanetas() {

		mazoPlaneta = new GestorMazoPlanetas();
		planetaActual = new Planeta("Tierra", 1, 3, 1, 0, -1, 0);
		galaxia[15][15] = planetaActual;
		coordActuales[0] = 15;
		coordActuales[1] = 15;
		Planeta planetaVacio = new Planeta("LIBRE", 0, 0, 0, 0, 0, 0);
		for (int i = 0; i <= 30; i++) {
			for (int j = 0; j <= 30; j++) {

				galaxia[i][j] = planetaVacio;
			}
		}

	}

	public void colocarDelMazoAGalaxia(Integer[] coordenadas) {
		if (estaLibreLaPosicion(coordenadas)) {
			nuevoPlaneta = mazoPlaneta.getMazoPlanetas().get(0);
			galaxia[coordenadas[0]][coordenadas[1]] = nuevoPlaneta;
			mazoPlaneta.getMazoPlanetas().remove(0);
		}

	}

	// devuelve cierto si esta libre
	public boolean estaLibreLaPosicion(Integer[] a) {
		boolean res;
		if (galaxia[a[0]][a[1]].nombrePlaneta.compareTo("LIBRE")==0)
			res = true;
		else
			res = false;

		return res;
	}

	public Integer[][] mirarAdyacencias(Integer[] coordenadas) {
		Integer[][] adyacentesLibres = new Integer[4][2];
		Integer[] der = { coordenadas[0] + 1, coordenadas[1] };
		Integer[] izq = { coordenadas[0] - 1, coordenadas[1] };
		Integer[] arr = { coordenadas[0], coordenadas[1] - 1 };
		Integer[] aba = { coordenadas[0], coordenadas[1] + 1 };
		if (estaLibreLaPosicion(der)) {
			adyacentesLibres[0][0] = der[0];
			adyacentesLibres[0][1] = der[1];
		}
		if (estaLibreLaPosicion(izq)) {
			adyacentesLibres[1][0] = izq[0];
			adyacentesLibres[1][1] = izq[1];
		}
		if (estaLibreLaPosicion(arr)) {
			adyacentesLibres[2][0] = arr[0];
			adyacentesLibres[2][1] = arr[1];
		}
		if (estaLibreLaPosicion(aba)) {
			adyacentesLibres[3][0] = aba[0];
			adyacentesLibres[3][1] = aba[1];
		}
		return adyacentesLibres;
	}

	public Integer[] getCoordActuales() {
		return coordActuales;
	}

	public void setCoordActuales(Integer[] coordActuales) {
		this.coordActuales = coordActuales;
	}

	public Planeta getNuevoPlaneta() {
		return nuevoPlaneta;
	}

	public void setNuevoPlaneta(Planeta nuevoPlaneta) {
		this.nuevoPlaneta = nuevoPlaneta;
	}

	// Metodo que devuelve una lista de los planetas adyacentes

	public List<Planeta> recogerPlanetasAdyacente() {
		List<Planeta> lista = new LinkedList<Planeta>();
		Integer[] miroDer = { coordActuales[0], coordActuales[1] + 1 };
		Integer[] miroIzq = { coordActuales[0] + 1, coordActuales[1] };
		Integer[] miroArr = { coordActuales[0] - 1, coordActuales[1] };
		Integer[] miroAba = { coordActuales[0], coordActuales[1] - 1 };

		if (!estaLibreLaPosicion(miroDer)) {
			lista.add(galaxia[miroDer[0]][miroDer[1]]);
		}
		if (!estaLibreLaPosicion(miroIzq)) {
			lista.add(galaxia[miroIzq[0]][miroIzq[1]]);
		}
		if (!estaLibreLaPosicion(miroArr)) {
			lista.add(galaxia[miroArr[0]][miroArr[1]]);
		}
		if (!estaLibreLaPosicion(miroAba)) {
			lista.add(galaxia[miroAba[0]][miroAba[1]]);
		}
		return lista;
	}

	public String toString(Planeta p){
		String cadena;
		cadena="________________________________________\n"+"| El planeta es: "+ p.getNombrePlaneta()+
		"\n"+"| y esta a una distancia de: "+ p.getDistancia()+"\n"
		+"| y contiene los siguientes datos:\n"
		+"| Agricultura: "+ p.getModAgricultura()+"\n"+
		"| Armas: "+ p.getModArmas()+"\n"+
		"| Industria: "+ p.getModIndustria()+"\n"+
		"| Contrabando: "+ p.getModContrabando()+"\n"+
		"| y la multa en este planeta es de: x"+ p.getMulta()+"\n"
		+"_________________________________________\n";
		return cadena;
	}

	public GestorMazoPlanetas getMazoPlaneta() {
		return mazoPlaneta;
	}

	public void setMazoPlaneta(GestorMazoPlanetas mazoPlaneta) {
		this.mazoPlaneta = mazoPlaneta;
	}
}
